//
// Created by 32827 on 2024/1/17.
//
#include "yzf_gpio.h"
YZF_RESULT yzf_gpio_open_clock(YZF_GPIO_POINTER gpio){
    switch (gpio) {
        case GPIOA:
            rcu_periph_clock_enable(RCU_GPIOA);
            break;
        case GPIOB:
            rcu_periph_clock_enable(RCU_GPIOB);
            break;
        case GPIOC:
            rcu_periph_clock_enable(RCU_GPIOC);
            break;
        case GPIOD:
            rcu_periph_clock_enable(RCU_GPIOD);
            break;
        case GPIOE:
            rcu_periph_clock_enable(RCU_GPIOE);
            break;
        case GPIOF:
            rcu_periph_clock_enable(RCU_GPIOF);
            break;
        case GPIOG:
            rcu_periph_clock_enable(RCU_GPIOG);
            break;
        case GPIOH:
            rcu_periph_clock_enable(RCU_GPIOH);
            break;
        case GPIOI:
            rcu_periph_clock_enable(RCU_GPIOI);
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_close_clock(YZF_GPIO_POINTER gpio){
    switch (gpio) {
        case GPIOA:
            rcu_periph_clock_disable(RCU_GPIOA);
            break;
        case GPIOB:
            rcu_periph_clock_disable(RCU_GPIOB);
            break;
        case GPIOC:
            rcu_periph_clock_disable(RCU_GPIOC);
            break;
        case GPIOD:
            rcu_periph_clock_disable(RCU_GPIOD);
            break;
        case GPIOE:
            rcu_periph_clock_disable(RCU_GPIOE);
            break;
        case GPIOF:
            rcu_periph_clock_disable(RCU_GPIOF);
            break;
        case GPIOG:
            rcu_periph_clock_disable(RCU_GPIOG);
            break;
        case GPIOH:
            rcu_periph_clock_disable(RCU_GPIOH);
            break;
        case GPIOI:
            rcu_periph_clock_disable(RCU_GPIOI);
            break;
        default:
            return YZF_NOT_FOUND;
    }
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_PP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,pin);
    gpio_output_options_set(gpio,GPIO_OTYPE_PP,GPIO_OSPEED_MAX,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OD(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,pin);
    gpio_output_options_set(gpio,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_AFPP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_AF,GPIO_PUPD_NONE,pin);
    gpio_output_options_set(gpio,GPIO_OTYPE_PP,GPIO_OSPEED_MAX,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_AFOD(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_AF,GPIO_PUPD_NONE,pin);
    gpio_output_options_set(gpio,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_FLOAT(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_INPUT,GPIO_PUPD_NONE,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_PULL_UP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_PULL_DOWN(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_INPUT,GPIO_PUPD_PULLDOWN,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OUT_PULL_UP(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_OUT_PULL_DOWN(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_IN_ANALOG(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_mode_set(gpio,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_MIDDLE(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_output_options_set(gpio,GPIO_OTYPE_PP,GPIO_OSPEED_LEVEL2,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_LOW(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_output_options_set(gpio,GPIO_OTYPE_PP,GPIO_OSPEED_LEVEL1,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_HIGH(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_output_options_set(gpio,GPIO_OTYPE_PP,GPIO_OSPEED_LEVEL3,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set_0(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_bit_reset(gpio,pin);
    return YZF_OK;
}
YZF_BOOL yzf_gpio_get(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    return gpio_input_bit_get(gpio,pin)==SET?YZF_TRUE:YZF_FALSE;
}
YZF_RESULT yzf_gpio_set_1(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_bit_set(gpio,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set0(YZF_GPIO_POINTER gpio,uint16_t pin){
    gpio_bit_reset(gpio,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_set1(YZF_GPIO_POINTER gpio,uint16_t pin){
    gpio_bit_set(gpio,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_lock(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_pin_lock(gpio,pin);
    return YZF_OK;
}
YZF_RESULT yzf_gpio_unlock(YZF_GPIO_POINTER gpio,YZF_GPIO_PIN pin){
    gpio_pin_lock(gpio,0);
    return YZF_OK;
}

YZF_GPIO_POINTER  mGpio= (YZF_GPIO_POINTER) YZF_NULL;
YZF_GPIO_PIN  mPin=YZF_NULL;
YZF_RESULT yzf_gpio(YZF_GPIO_POINTER gpio){
    mGpio=gpio;
    return YZF_OK;
}
YZF_RESULT yzf_gpio_pin(YZF_GPIO_PIN pin){
    mPin=pin;
    return YZF_OK;
}
YZF_RESULT yzf_gpio_open_clock_(){
    YZF_CHECK_PARAM(mGpio)
    return yzf_gpio_open_clock(mGpio);
}
YZF_RESULT yzf_gpio_close_clock_(){
    YZF_CHECK_PARAM(mGpio)
    return yzf_gpio_close_clock(mGpio);
}
YZF_RESULT yzf_gpio_set_PP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_PP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OD_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OD(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_AFPP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_AFPP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_AFOD_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_AFOD(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_FLOAT_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_FLOAT(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_PULL_UP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_PULL_UP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_PULL_DOWN_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_PULL_DOWN(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OUT_PULL_UP_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OUT_PULL_UP(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_OUT_PULL_DOWN_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_OUT_PULL_DOWN(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_IN_ANALOG_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_IN_ANALOG(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_MIDDLE_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_MIDDLE(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_LOW_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_LOW(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_HIGH_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_HIGH(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_0_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_0(mGpio,mPin);
}
YZF_RESULT yzf_gpio_set_1_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_set_1(mGpio,mPin);
}
YZF_RESULT yzf_gpio_lock_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_lock(mGpio,mPin);
}
YZF_RESULT yzf_gpio_unlock_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_unlock(mGpio,mPin);
}
YZF_BOOL yzf_gpio_get_(){
    YZF_CHECK_PARAM(mGpio)
    YZF_CHECK_PARAM(mPin)
    return yzf_gpio_get(mGpio,mPin);
}